package xyz.heyaoshare.exceptions.customize;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;
import xyz.heyaoshare.exceptions.code.ErrorCode;
import xyz.heyaoshare.utils.ExceptionUtils;

/**
 * 自定义服务异常
 * @author YueHe
 * @version 0.0.1
 * @since 2025/6/25 上午10:26
 */
@Data
@Slf4j
@EqualsAndHashCode(callSuper = true)
public class ServerException extends RuntimeException {

    /**
     * 错误码
     */
    private int code;
    /**
     * 错误提示
     */
    private String message;

    public ServerException() {
    }

    /**
     * 构造函数，根据指定的错误代码创建一个新的 ServerException 实例。
     *
     * @param errorCode 错误代码枚举类型实例，用于指定异常的错误代码和消息。
     */
    public ServerException(ErrorCode errorCode) {
        this.code = errorCode.getCode();
        this.message = errorCode.getMessage();
    }

    /**
     * ServerException 构造函数
     *
     * @param code     异常代码
     * @param message  异常信息
     */
    public ServerException(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    /**
     * ServerException的构造函数
     *
     * @param message 异常信息
     */
    public ServerException(String message) {
        this.code = 500;
        this.message = message;
    }

    /**
     * 根据错误码和参数生成 ServerException 异常。
     *
     * @param errorCode 错误码枚举
     * @param params    参数列表
     * @return ServerException 异常对象
     */
    public static ServerException exception(ErrorCode errorCode, Object... params) {
        String message = ExceptionUtils.doFormat(errorCode.getCode(), errorCode.getMessage(), params);
        return new ServerException(errorCode.getCode(), message);
    }

    /**
     * 创建一个 ServerException 异常对象。
     *
     * @param code 异常码，整型。
     * @param message 异常信息，字符串类型。
     * @return 返回一个 ServerException 对象。
     */
    public static ServerException exception(Integer code, String message) {
        return new ServerException(code, message);
    }

    /**
     * 构造一个服务器异常对象
     *
     * @param code 异常代码
     * @param message 异常信息模板
     * @param params 异常信息模板参数
     * @return 构造的服务器异常对象
     */
    public static ServerException exception(Integer code, String message, Object... params) {
        String resultMessage = ExceptionUtils.doFormat(code, message, params);
        return new ServerException(code, resultMessage);
    }


    @Override
    public String getMessage() {
        return this.message;
    }

}